import { defineStore } from "pinia";

import {
  getTodoListApi,
  addTodoApi,
  updateTodoApi,
  delTodoApi,
  updateAllTodoApi,
  delAllTodoApi,
} from "../../api";

import type { TodoList } from "../../api/types";

interface TodoListStore {
  todoList: TodoList;
}

export const useTodoListStore = defineStore("todoList", {
  state: (): TodoListStore => {
    return {
      todoList: [],
    };
  },
  getters: {
    totalNum(state) {
      return state.todoList.length;
    },
    isDoneNum(state) {
      return state.todoList.reduce((p, c) => {
        return p + (c.isDone ? 1 : 0);
      }, 0);
    },
  },
  actions: {
    // 获取todoList
    async getTodoList() {
      const res = await getTodoListApi();
      this.todoList = res.data.data;
    },
    // 添加todo
    async addTodo(title: string) {
      // 更新服务器数据
      await addTodoApi(title);
      // 更新客户端数据(重新发送请求，获取列表展示)
      this.getTodoList();
    },
    // 单选
    async updateTodo(_id: string, isDone: boolean) {
      await updateTodoApi(_id, isDone);
      this.getTodoList();
    },
    // 单个删除
    async delTodo(_id: string) {
      await delTodoApi(_id);
      this.getTodoList();
    },
    // 全选&全不选
    async updateAllTodo(isDone: boolean) {
      const todoIdList = this.todoList
        .filter((todo) => todo.isDone !== isDone)
        .map((todo) => todo._id);
      await updateAllTodoApi(todoIdList, isDone);
      this.getTodoList();
    },
    // 批量删除
    async delAllTodo() {
      const todoIdList = this.todoList
        .filter((todo) => todo.isDone)
        .map((todo) => todo._id);
      await delAllTodoApi(todoIdList);
      this.getTodoList();
    },
  },
});
